<?php
App::uses('UsuariosController', 'Controller');

/**
 * TestUsuariosController *
 */
class TestUsuariosController extends UsuariosController {
/**
 * Auto render
 *
 * @var boolean
 */
	public $autoRender = false;

/**
 * Redirect action
 *
 * @param mixed $url
 * @param mixed $status
 * @param boolean $exit
 * @return void
 */
	public function redirect($url, $status = null, $exit = true) {
		//$this->redirectUrl = $url;
	}
	
	public function geraHash($senha){
		return parent::geraHash($senha);
	}
}

/**
 * UsuariosController Test Case
 *
 */
class UsuariosControllerTestCase extends ControllerTestCase {
/**
 * Fixtures
 *
 * @var array
 */
	public $fixtures = array('app.usuario');

/**
 * setUp method
 *
 * @return void
 */
	public function setUp() {
		parent::setUp();
		$this->Usuarios = new TestUsuariosController();
		$this->Usuarios->constructClasses();
		$this->Usuarios->Session->initialize($this->Usuarios);
		$this->view = new View($this->Usuarios);
        $this->session = $this->view->loadHelper('Session');
	}

/**
 * tearDown method
 *
 * @return void
 */
	public function tearDown() {
		unset($this->Usuarios);

		parent::tearDown();
	}

	public function testAddVazio() {
		$result = $this->testAction('usuarios/add', array('method'=>'get'));
		debug($result);
	}
	
	public function testAddErroSenhaDiferente(){
		$data = array('Usuario'=>array(
			'nome'=>'Nome',
			'senha'=>'123',
			'email'=>'example@example.com',
			'confirmar_senha'=>'123456'));
		$result = $this->testAction('usuarios/add', array('data'=>$data, 'return'=>'contents'));
		$this->assertRegExp("/Erro ao cadastrar! Verifique os erros e tente novamente/", $result);
	}
	
	public function testAddErroSemConfirmacao(){
		$data = array('Usuario'=>array(
			'nome'=>'Nome',
			'senha'=>'123',
			'email'=>'example@example.com',
			'confirmar_senha'=>''));
		$result = $this->testAction('usuarios/add', array('data'=>$data, 'return'=>'contents'));
		$this->assertRegExp("/Erro ao cadastrar! Verifique os erros e tente novamente/", $result);
	}
	
	public function testAddErroEmailErrado(){
		$data = array('Usuario'=>array(
			'nome'=>'Nome',
			'senha'=>'123',
			'email'=>'issoNaoEEmail',
			'confirmar_senha'=>'123',
			'apelido'=>'novo_apelido'));
		$result = $this->testAction('usuarios/add', array('data'=>$data, 'return'=>'contents'));
		$this->assertRegExp("/Erro ao cadastrar! Verifique os erros e tente novamente/", $result);
	}
	
	public function testAddErroEmailIgual(){
		$data = array('Usuario'=>array(
			'nome'=>'Nome',
			'senha'=>'123',
			'email'=>'existo@existo.com',
			'confirmar_senha'=>'123',
			'apelido'=>'novo_apelido'));
		$result = $this->testAction('usuarios/add', array('data'=>$data, 'return'=>'contents'));
		$this->assertRegExp("/Erro ao cadastrar! Verifique os erros e tente novamente/", $result);
	}
	public function testAddErroApelidoIgual(){
		$data = array('Usuario'=>array(
			'nome'=>'Um Nome',
			'senha'=>'Uma senha',
			'email'=>'example@example.com',
			'confirmar_senha'=>'Uma senha',
			'apelido'=>'apelido'));
		$result = $this->testAction('usuarios/add', array('data'=>$data, 'return'=>'contents'));
		$this->assertRegExp("/Erro ao cadastrar! Verifique os erros e tente novamente/", $result);	
	}
	
	public function testAddCorreto() {
		$data = array('Usuario'=>array(
			'nome'=>'Um Nome',
			'senha'=>'Uma senha',
			'email'=>'example@example.com',
			'confirmar_senha'=>'Uma senha',
			'apelido'=>'apelidoQueNaoExiste'
		));
		$result = $this->testAction('usuarios/add', array('data'=>$data, 'return'=>'view'));
		$this->assertContains('reviews/', $this->headers['Location']);
	}
	
	public function testGeraHash(){
		$expected = "d5fe385b0303439b87fd254d59bc410ebceab0de";
		$this->assertEquals($this->Usuarios->geraHash("senha"), $expected); 
	}
	
	public function testGeraHashVazio(){
		$expected = null;
		$this->assertEquals($this->Usuarios->geraHash(""), $expected); 
	}
	
	public function testAtivarSemHash(){
		$this->setExpectedException('NotFoundException');
		$this->testAction('usuarios/ativar');
	}
	
	public function testAtivarErrado(){
		$result = $this->testAction('usuarios/ativar/issoAquiNaoExiste');
		$this->assertContains("Houve um erro na sua ativação! Sua conta já foi ativada?", $this->session->flash());
	}
	
	public function testAtivarCorreto(){
		$result = $this->testAction('usuarios/ativar/ativa');
		$this->assertContains("Sua conta foi ativada com sucesso!", $this->session->flash());
	}
	
	public function testMeuPerfil(){
		$data = array('Usuario'=>array('id'=>1, 'facebook'=>'facebook.com.br'));
		$result = $this->testAction('usuarios/meu_perfil', array('data'=>$data));
		$this->assertContains("Perfil atualizado com sucesso!", $this->session->flash());
	}
	
	public function testMeuPerfilErrado(){
		$data = array('Usuario'=>array('id'=>1, 'facebook'=>'facebook.com.br', 'email'=>'teste'));
		$result = $this->testAction('usuarios/meu_perfil', array('data'=>$data));
		$this->assertContains("Erro ao atualizar!", $this->session->flash());
	}
	
	public function testPerfilErradoVazio(){
		$this->setExpectedException('NotFoundException');
		$this->testAction('/usuarios/perfil');
	}
	
	public function testPerfilErradoNaoExiste(){
		$this->setExpectedException('NotFoundException');
		$this->testAction('/usuarios/perfil/999999');
	}
	
	public function testPerfilCorreto(){
		$expected = array('Usuario'=>array(
        	'id' => 1,
        	'nome' => "Nome",
        	'email' => "nome@nome.com",
        	'senha' => 'd5fe385b0303439b87fd254d59bc410ebceab0de',
        	'reviews' => 10,
        	'nota_media' => 5,
        	'apelido'=>'apelido',
        	'ativo'=>0,
        	'security_hash'=>'ativa',
			'facebook'=>'',
			'homepage'=>'',
			'twitter'=>'',
        ));
		$result = $this->testAction('/usuarios/perfil/1/-1', array('return'=>'vars'));
		//pr($result['dados']);exit;
		$this->assertEquals($result['dados'], $expected);
	}
}
